"""
策略类
"""
from meta.utils import LogMixin


class Strategy(LogMixin):
    """策略"""

    def __init__(self, player):
        """策略类

        player: 玩家
        通过当前分数和历史分数，决定下注的多少。

        player.history样例
        {
            "win": [],  # 赢的历史，True表示赢，False表示输
            "wage": [],  # 下注历史
            "score": []  # 分数历史
        }
        """
        history = player.history

        super().__init__()
        self.win_history = history["win"]  # 赢的历史
        self.wage_history = history["wage"]  # 下注历史
        self.score_history = history["score"]  # 分数历史

        self.score = len(player.scores)  # 当前分数

        if self.win_history == []:
            # 第一次下注
            self.first_time = True
            self.last_win = False
            self.last_wage = 0
        else:
            # 非第一次下注
            self.first_time = False
            self.last_win = self.win_history[-1]  # 上一次是否赢
            self.last_wage = self.wage_history[-1]  # 上一次下注的分数

        self.logger.info('策略初始化完毕')

    def calculate(self):
        """计算下注分数"""
        raise NotImplementedError


class LineStrategy(Strategy):
    """线性策略"""

    def calculate(self):
        """计算下注分数

        下注分数为当前分数的0.5倍。

        """
        return self.score * 0.5


class DoubleEveryTimeStrategy(Strategy):
    """每次下注两倍策略"""

    def calculate(self):
        """每次下注是上一次的两倍

        如果上次输了，则下注是上一次的两倍。
        如果上次赢了，则从1开始下注。
        """
        if self.first_time:
            # 第一次下注
            return 1
        else:
            # 非第一次下注
            if self.last_win:
                # 上一次胜利
                return 1
            else:
                # 上一次失败
                return self.last_wage * 2
